#include "sceneundostack.h"

SceneUndoStack::SceneUndoStack()
	: index(0)
{
	stack.clear();
}

/**
 * Можно отменить?
 * @return true, если отменить можно (К.О.)
 */
bool SceneUndoStack::canUndo()
{
	if (index>0 && stack.count()>0)
		return true;
	return false;
}

/**
 * Можно повторить?
 * @return true, если повторить можно (К.О.)
 */
bool SceneUndoStack::canRedo()
{
	if (index<stack.count()-1)
		return true;
	return false;
}

/**
 * Отменить действие, т.е. вернуть предыдущее состояние и сделать его текущим.
 * Если это было нельзя сделать, то будет бида.
 * @return Предыдущее состояние
 */
UndoData SceneUndoStack::undo()
{
	return stack[--index];
}

/**
 * Повторить действие, т.е. вернуть следующее состояние и сделать его текущим.
 * Если это было нельзя сделать, то будет бида.
 * @return Следующее состояние
 */
UndoData SceneUndoStack::redo()
{
	return stack[++index];
}

/**
 * Очистить стек.
 */
void SceneUndoStack::clear()
{
	stack.clear();
	index = 0;
}

/**
 * Добавить новое состояние.
 * Состояние представляет собой XML-строку, полученную в CustomGraphicsScene::toXML().
 * Все повторы, которые расположены за текущим состоянием, будут уничтожены.
 *
 * @see CustomGraphicsScene::toXML()
 */
void SceneUndoStack::addState (const UndoData &data)
{
	while(stack.count()>index)
		stack.removeAt(index);
	stack << data, ++index;
}

/**
 * Возвращает первую отмену
 * (т.к. текущее сохраняется только при наличии изменений).
 */
UndoData SceneUndoStack::currentState()
{
	return canRedo()? stack[index] : "[current]";
}
